# -*- coding: utf-8 -*-
from Modele.Entite.Entite import *
from Modele.Entite.Objet import * 
import helper
import copy

class Personnage(Entite):
	def __init__(self, modele):
		Entite.__init__(self, modele)
		self.vie = 100
		self.inventaire = []
		self.armeEnMain = 1
		self.pointage = 0 #pour le moment
		self.poing = (Arme(modele,5,0,1,1,"poing"))
		self.couteau = (Arme(modele,20,0,2,2,"couteau"))
		self.pistolet = (Arme(modele,10,13,75,3,"pistolet"))
		self.fusil = (Arme(modele,30,20,100,4,"fusil"))
		self.metal = (Item(modele,0,"metal"))
		self.energie = (Item(modele,0,"energie"))
		self.arme = self.poing
		
	def deplacer(self, deplacement, mode):
		x = self.position[0]
		y = self.position[1]
		direction = copy.copy(self.rotation)
		
		if (mode == "dreculer"):
			deplacement *= -1
		elif (mode == "dlateralD"):
			direction -= 90
			if(direction < 0):
				direction += 360
		elif (mode == "dlateralG"):
			direction += 90
			if(direction > 360):
				direction -= 360

		nouvPos = helper.Helper.getAngledPoint(direction,deplacement,x,y)
		nouvPos.append(0)
		
		#print(nouvPos)
		#Demander de vérifier si la nouvelle position entre en collision avec un mur
		if(self.detectEntiteVsEntite(self) == True and self.detectJoueurVsMur(nouvPos) == True):
			#Si vrai, on modifie la position
			self.position = nouvPos
			return nouvPos
		else:
			#Si faux, on retourne la position précédente
			return self.position

	def tourner(self,rotation, mode):
		if (mode == "rtournerG"):
			rotation *= -1
		self.rotation += rotation
		if(self.rotation > 360):
			self.rotation -= 360
		elif (self.rotation < 0):
			self.rotation += 360
		return rotation

	def changerArme(self,arme):
		if (arme == "cArme1"):
			self.arme=self.poing
			self.armeEnMain=1
		elif (arme == "cArme2"):
			self.arme=self.couteau
			self.armeEnMain=2
		elif (arme == "cArme3"):
			self.arme=self.pistolet
			self.armeEnMain=3
		elif (arme == "cArme4"):
			self.arme=self.fusil
			self.armeEnMain=4

	def mourir(self):#pour la vue , doit faire un déplacement forcé vers le spawning point!
		pass 
	
	def modVie(self, mod):
		self.vie += mod
		if self.vie <= 0 :
			self.mourir() 
		
	def attaquer(self,arme , liste):#attaquer a main nue ou bien avec une autre arme qu'une arme ÃƒÂ  feu
		if arme.numArme == 1 or arme.numArme == 2:
			self.toucher(arme,arme.range)
			print("toucher avec poing ou couteau")	
			return True
		elif arme.numArme == 3 or arme.numArme == 4:
			if arme.balles > 0: 
				self.tirer(arme , liste)#appler la fonction tirer
				return True
			else:	#si l'arme n'a plus de balle, l'arme est enlevÃ© de son inventaire
				self.armeEnMain = 1#On lui met seulement son statut de poing comme arme
				#for armeBoucle in self.inventaire:#Verifie s'il y une autre arme dans son inventaire
				#	if armeBoucle.enMain == True: #on trouve l'arme dans sa main
				#		self.inventaire.remove(armeBoucle) #on la retire de l'iventaire
		else:
			print("ne peut pas attaquer")	
			return False
			
	def toucher(self,arme ,distance): #fonction qui permet de savoir si l'atttaquant ÃƒÂ  touchÃƒÂ© sa cible
		if distance <= arme.range : #si l'entite est a une distance qui fait parti du range ne notre arme
			print("Cible Toucher ")
			return True #l'entite est touchee , retourner vrai
		else:#sinon retourner faux
			print("Cible rater")
			return False

	def ajouterPoint(self,valeur):#pour le moment
		self.pointage += valeur
		
	def tirer(self,arme,liste): #faire de vÃ©rification pour coller au code d'Antoine
		arme.balles -= 1 #le personnage perd des balles
		newPos = []
		if(liste == None):
			print("La liste est vide ")
			return False
			
		if liste is not None:
			if liste[0] in 'Joueur': #si cette entite est un joueur 
				if (self.toucher(arme,liste[1])) == True: #verifier si on peut est a la bonne distance pour l'atteindre
					print("Entite Joueur toucher")
					self.ajouterPoint(50) # lui donner un certains nombre de point 
					print("Nouveau pointage" , self.pointage)#juste pour verifier que le pointage est correctement appliquer 
					liste[0].ajouterPoint(-50)#l'autre joueur doit perdre des points ou de la vie 			
					return True
			
			elif liste[0].find("Gardien") >-1: #verifier si l'entite est un logomateGardien
				if self.toucher(arme,liste[1]) == True:#verifier si on peut est Ã  la bonne distance pour l'atteindre
					print("entite LogomateGardien toucher")
					self.ajouterPoint(65)
					print("Nouveau pointage", self.pointage)
					#self.controleur.modele.entites[liste[0]].ajouterPoint(-65) #pas de fonctions pour enlever de l'energie au logomate
					#le logomate perd de l'energie --> situer ou mettre se code 
					return True
		#else:
		
		'''pas sur pour cette fonction '''
		newPos.append(liste[2])  # posX = posx de l'enemi
		newPos.append(liste[3])  # posY = posY Dde l'enemi
		newPos.append(self.position[2]) #le z reste le meme donc le Z du joueur 
		newPos.append(liste[1]) # distance = a la distance calculer
		self.modele.controleur.vue.tirerAnimBalle(newPos)
	
		
		
		
	def calculDistance(self,nom,joueur,enemi): ##Fonction qui calcul la distance entre un joueur et sa cible
		
		xAttaquant = ''
		yAttaquant = ''
		xEnemi = ''
		yEnemi = ''
		
		vectorAtt = enemi##on prend les variable vector dans des parametres
		vectorEnmi = joueur
		nomenemi = nom
		
		for i in range(0,len(vectorAtt)):#boucle pour prendre les nombres dans les string
			if vectorAtt[i] in '(':
				for j in range(i+1,i+11):#1 pour aller devant la paranthèse et 11 pour le range de la boucle
					if vectorAtt[j] not in '.':# on arete au point pour finir la prise des coordonnées 
						xAttaquant += vectorAtt[j]
					else:
						break
			elif vectorAtt[i] in ',':
				for j in range(i+2,i+12):#2 pour aller devant la virgule et 12 pour le range de la boucle
					if vectorAtt[j] not in '.': # on arete au point pour finir la prise des coordonnées
						yAttaquant += vectorAtt[j]
					else:
						break
				break
				
		for i in range(0,len(vectorEnmi)):
			if vectorEnmi[i] in '(':
				for j in range(i+1,i+11):#1 pour aller devant la paranthèse et 11 pour le range de la boucle
					if vectorEnmi[j] not in '.':# on arete au point pour finir la prise des coordonnées 
						xEnemi += vectorEnmi[j]
					else:
						break
			elif vectorEnmi[i] in ',':
				for j in range(i+2,i+12):#2 pour aller devant la virgule et 12 pour le range de la boucle
					if vectorEnmi[j] not in '.': # on arete au point pour finir la prise des coordonnées
						yEnemi += vectorEnmi[j]
					else:
						break
				break


		
		xDistance = int(xEnemi) - int(xAttaquant)#on calcul la longeur des segements de notre trigangle de distance
		yDistance = int(yEnemi) - int(yAttaquant)
		
		distanceReel = xDistance**2 + yDistance**2#ici on fait l'hypoténuse des segement pour avoir la distance
		distanceReel = math.sqrt(distanceReel)
		
		liste = []#on met le nom dans la liste et la distance
		#print(nomenemi)
		#print(distanceReel)
		liste.append(nomenemi)
		liste.append(distanceReel)
		liste.append(int(xEnemi))
		liste.append(int(yEnemi))
		return liste#on retourne la liste

		
